package core.manager;

import core.util.COREServiceRegistry;
import core.worker.Address;
import java.util.LinkedList;
import org.apache.log4j.Logger;

/**
 * La Classe WorkerNetwork mantiene al suo interno la lista (LinkedList) di tutti i workers presenti nella rete.
 * E' collegata direttamente al Manager e all' Activity per l'assegnazione dei Workflow
 * @author Vincenzo Merlo, Scuderi Giovanni Luca, Paolo Giuffrida
 *
 */
public class WorkerNetwork {

    private final Logger logger = COREServiceRegistry.getLogger(WorkerNetwork.class.toString());
    private LinkedList<Address> workers = new LinkedList<Address>();

    /**
     *
     */
    public WorkerNetwork() {
    }

    /**
     * Ritorna l'indirizzo del Worker alla specifica posizione nella lista
     * @param int, indice della lista
     * @return indirizzo del worker
     */
    public Address getWorker(int index) {
        logger.trace("getWorker");
        try {
            Address tmp = (Address) (workers.get(index));
            return tmp;
        } catch (Exception e) {
            logger.error("getWorker error: " + e.getStackTrace());
            return null;
        }
    }

    /**
     * Inserisce un worker nella lista
     * @param indirizzo del worker da inserire
     * @return indice della lista nella quale viene inserito
     */
    public int addWorker(Address worker) //TODO: attenzione si deve controllare che sia unico
    {
        logger.trace(" addWorker");
        workers.add(worker);
        return (workers.size() - 1);
    }

    /**
     * Ritorna tutta la lista dei workers
     * @return lista (LinkedList) dei workers
     */
    public LinkedList<Address> getWorkers() {
        logger.trace("getWorkers");
        return workers;
    }

    /**
     * Setta la lista dei workers
     * @param lista (LinkedList) dei workers da settare
     */
    public void setWorkers(LinkedList<Address> workers) {
        logger.trace("setWorkers");
        this.workers = workers;
    }
    
    /**
     *
     * @return string
     */
    @Override
    public String toString() {
    	StringBuilder sb = new StringBuilder(WorkerNetwork.class.getSimpleName());
    	for (Address addr: this.getWorkers()) {
    		sb.append("\n\t").append(addr);
    	}
    	
    	return sb.toString();
    }
}
